package com.zb.uniman.aop;

import cn.hutool.core.date.StopWatch;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * Author:B
 * Description:*：匹配任何参数类型或返回类型，例如 execution(* com.njf.aop.calc.*.*(..)) 将匹配所有返回类型为void的方法，并且参数类型为任意类型。
 *
 * *（不加引号）：匹配当前类及其所有子类中的方法，例如 execution(public * com.sample.service.*.*(..)) 将匹配所有返回类型为void的公共方法，并且参数类型为任意类型。
 *
 * ..：匹配当前包及其所有子包中的方法，例如 execution(public * com.sample.service..*.*(..)) 将匹配所有返回类型为void的公共方法，并且参数类型为任意类型。
 *@Around("@annotation(authCheck)")
 * * 和 .. 结合使用：匹配当前包及其所有子包中的方法，并且参数类型为任意类型，例如 execution(* com.sample.service.impl..*.*(..)) 将匹配当前包及其所有子包中的返回类型为void的方法，并且参数类型为任意类型。
 */
@Component
@Aspect
public class ReinforceAop {
    //切入点
//    @Pointcut("execution(* com.zb.uniman.service.*.login())")     ok
//    public void pt() {
//    }

//    @Before("pt()")  ok
//    @Around("pt()")  ok
//    @Around("execution(* com.zb.uniman.service.*.login())")    ok
    public void sayhi(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("当前时间111：" + System.currentTimeMillis());
        pjp.proceed();
        System.out.println("method exe end!");
    }

    /**
     * 计算方法执行花费时间
     * @param pp
     * @param timeCheck
     * @return
     * @throws Throwable
     */
    @Around("@annotation(timeCheck)")            //ok
    public Object authinterceptor(ProceedingJoinPoint pp,TimeCheck timeCheck) throws Throwable {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
//        获取参数
//        Object[] args = pp.getArgs();
//        String string = Arrays.toString(args);
//        System.out.println(string);

        Object o = pp.proceed();
        stopWatch.stop();
        System.out.println("该方法花费时间------------"+stopWatch.getTotalTimeMillis()+"毫米");
        return o;
    }
}
